Global strict loading mode setting, route draw deferring and more | This Week in Rails
Railsのセキュリティリリースがあったというお知らせです
各位バージョンアップしましょう
RubyConf 2024は2024年11月13日(水)〜15日(金)にシカゴで開催されます
スピーカーの募集は2024年6月6日(木)から始まっており、2024年7月8日(月)まで受け付けています
ActiveRecordに関する変更です
第16回で紹介したstrict_loadingモードに関連する変更がされています
strict_loadingモードはレコードが関連付けを遅延読み込みしようとしたときの振る舞いを制御するものです
:all を指定するとすべての遅延読み込みをエラーとし、:n_plus_one_only を指定するとN+1が発生するような遅延読み込みをエラーとします
このstrict_loadingモードはアプリケーション全体で有効/無効を切り替えることができます
3.8.29 config.active_record.strict_loading_by_default
strict_loadingモードをデフォルトで有効にするか無効にするかを指定するboolean値です。デフォルト値はfalseです。
ただし、有効にしたときに適用されるstrict_loadingのモードは :all のみでした
つまり :n_plus_one_only をアプリケーション全体に指定する手段がない、という状況でした
今回のプルリクエストでは、この状況に対して config.active_record.strict_loading_mode という設定を追加し :n_plus_one_only も指定できるようにしました
この設定項目のデフォルト値は :all です
railtiesに関する変更です
ルーティングの描画を最初のリクエスト、または、url_helpersが呼ばれるまで遅延する仕組みが実装されました
これまではrails runner、テスト、rake taskの実行などの際にも常にルーティングの描画をする仕組みになっていました
中にはルーティングが不要なシーンにもあります
たとえばrails runnerであるモデルのあるレコードのデータを参照するだけ、など
ルーティングがたくさんあるアプリケーションにおいては、ルーティングの描画に時間がかかるので、この時間を削減したい、というモチベーションでこのプルリクエストが出されたようです
プルリクエストには、この実装前後でルーティングが2000件あるアプリケーションのrails runnerの実行結果が記載されていました
code:before.sh
% time bin/rails runner ""
bin/rails runner "" 0.66s user 0.33s system 95% cpu 1.036 total
code:after.sh
% time bin/rails runner ""
bin/rails runner "" 0.47s user 0.32s system 98% cpu 0.791 total
この実験結果では、約0.2秒の高速化がされています